本文介绍在 ROS 的 launch 文件中经常被使用到的三个与参数设置有关的标签 <arg>
、<param>
、rosparam
。
$\lt arg \gt$
- 声明 argument
-
1
<arg name="arg-name" .../>
- 指定 argument 的值
-
1
2
3
4
5# 在命令行赋值
roslaunch package-name launch-file-name arg-name:=arg-value
# 在声明 argument 时赋值
<arg name="arg-name" default="arg-value" />
<arg name="arg-name" value="arg-value" />- default 和 value 的区别在于,在命令行中赋值的参数可以覆盖 default,但是不能重写 value 的值。
- 获取变量值
-
1
$(arg arg-name)
- 我们可以通过 $arg$ 来使用该变量,roslaunch 会用给定的参数 $arg-name$ 的值替换整个表达式的值。
- 将 argument 值传递给 included launch 文件
-
1
2
3
4<include file="path-to-file">
<arg name="arg-name" value="arg-value" />
...
</include>- 注意:若 launch 文件及其 include 的 launch 文件出现相同的 argument,通过如下方式传递给 include launch 文件
-
1
<arg name="arg-name" value="$(arg arg-name)" />
- 第一个 arg-name 表示 include launch 文件中的变量;第二个则表示当前 launch 文件中的变量 $\Longrightarrow$ 指定的变量在当前 launch 文件以及 included launch 文件中都有相同的值。
$\lt rosparam \gt$
- 尽管 argument(变量)和 parameter(参数)优势可互换,但二者在 ROS 中的意义完全不同:parameters 是 ROS 系统使用的数值,存在 parameter server 上,nodes 可通过
ros::param::get
函数编程得到,用户可通过rosparam
命令获取;与之不同,arguments 仅在 launch 文件内部有意义,nodes 不能直接获取它们的值 - 前面介绍的
<arg>
用于设置变量;接下来介绍的两个<param>
和<rosparam>
标签用于设置参数。 - 参数访问有三种方式
- 命令行:
rosparam set
、rosparam get
- launch 文件:
<param>
、<rosparam>
- API
- roscpp:
ros::param::set
、ros::param::get
- rospy:
set_param
、set_param
- roscpp:
- 命令行:
<rosparam>
通过配置文件*.yaml
文件加载参数-
1
<rosparam file="$(find navigation_launch)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam>
其他常见方式-
1
2
3
4
5
6<rosparam command="delete" param="my/param" />
<rosparam param="a_list">[1, 2, 3, 4]</rosparam>
<rosparam>
a: 1
b: 2
</rosparam>
$\lt param \gt$
<param>
更像是 define 宏,必须在本地 launch 文件中赋值,无法用于在 launch 文件中获取命令中的参数(但可以通过下面介绍 rosrun 方式),通过以下方式接收和传递。定义的参数均会保留在 ROS 参数服务器(PARAMETERS)中,该参数会被节点(NODES)使用进行节点配置。-
1
2
3
4
5
6
7<launch>
<param name="param-name-1" value="false" />
<node ....>
<param name="param-name-2" value="...">
</node>
...
</launch>- 第一个参数 param-name-1 是整个 launch 全局(global)有效;第二个参数 param-name-2 相对(relative)节点局部(private)有效。
- rosrun 本身的设计是可以让使用者直接修改节点内的参数,通过以下的方式:
-
1
rosrun package-name node-name _param-name:=param-value
- ROS ANSWERS: When to use param and rosparam on launch file?
I believe that the main difference is that
<param>
may be used to set a single command on the ROS parameter server, while<rosparam>
can be used to evaluate groups of parameters.
So, in the cases above,<param>
is setting a single parameter, and that parameter is an entire URDF file. The<rosparam>
tag is reading in the rosparam yaml format from within the launch file.
The value set by the<param>
tag may only be a string, int, bool, or double, which may be set through the xml attribute value, or by reading in from a text file, bin file, or the output of a command line command.
The value set by the<rosparam>
tag is most commonly a batch of related parameters, read in from a YAML file (or from the output of rosparam dump). You can think of it as a programmatic way to access the functionality of rosparam from a launch file.